package com.xzy.spring.aaa;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ResolvableType;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;

/**
 * JDK的Type以及Spring的ResolvableType的使用对比
 *
 * @author xzy.xiao
 * @date 2023/3/8  20:01
 */
@Slf4j
class GenericClass {
    private HashMap<String, List<Integer>> field;

    public static void main(String[] args) throws NoSuchFieldException {
        analysisByJDK();

        System.out.println("==========");

        analysisBySpring();
    }

    /**
     * 使用JDK提供的Type解析泛型信息，需要进行强制类型转换
     *
     * @throws NoSuchFieldException -
     */
    private static void analysisByJDK() throws NoSuchFieldException {
        Field field = GenericClass.class.getDeclaredField("field");
        ParameterizedType fieldType = (ParameterizedType) field.getGenericType();
        Type[] argType = fieldType.getActualTypeArguments();
        log.info("解析HashMap<String, List<Integer>>中的HashMap：{}", fieldType.getRawType());
        log.info("解析HashMap<String, List<Integer>>中的HashMap的父类型：{}", ((Class) fieldType.getRawType()).getSuperclass());
        log.info("解析HashMap<String, List<Integer>>中的String：{}", ((Class) argType[0]));
        log.info("解析HashMap<String, List<Integer>>中的List<Integer>：{}", ((ParameterizedType) argType[1]));
        log.info("解析HashMap<String, List<Integer>>中的List：{}", ((ParameterizedType) argType[1]).getRawType());
        log.info("解析HashMap<String, List<Integer>>中的Integer：{}", ((Class) ((ParameterizedType) argType[1]).getActualTypeArguments()[0]));
    }

    /**
     * 使用Spring的ResolvableType解析泛型信息，相对简单
     *
     * @throws NoSuchFieldException -
     */
    private static void analysisBySpring() throws NoSuchFieldException {
        Field field = GenericClass.class.getDeclaredField("field");
        ResolvableType fieldResolvableType = ResolvableType.forField(field);
        log.info("解析HashMap<String, List<Integer>>中的HashMap：{}", fieldResolvableType.getRawClass());
        log.info("解析HashMap<String, List<Integer>>中的HashMap的父类型：{}", fieldResolvableType.getSuperType().getRawClass());
        log.info("解析HashMap<String, List<Integer>>中的HashMap的父类型：{}", fieldResolvableType.getSuperType());
        log.info("解析HashMap<String, List<Integer>>中的String：{}", fieldResolvableType.getGeneric(0).resolve());
        log.info("解析HashMap<String, List<Integer>>中的List<Integer>：{}", fieldResolvableType.getGeneric(1));
        log.info("解析HashMap<String, List<Integer>>中的List：{}", fieldResolvableType.getGeneric(1).resolve());
        log.info("解析HashMap<String, List<Integer>>中的Integer：{}", fieldResolvableType.getGeneric(1, 0));
    }
}
